10991. Регион

 

Три окружности с радиусами r1, r2 и r3 попарно касаются друг друга. Найти площадь области G, которая находится между окружностями.

 

 

 

 

 

 

 

 

 

 

 

 


Вход. Первая строка содержит количество тестов. Каждый тест состоит из одной строки, содержащей радиусы окружностей r1, r2 и r3.

 

Выход. Для каждого теста вывести площадь области между окружностями G, округленной до шести знаков после десятичной точки.

 

Пример входа

2

5.70 1.00 7.89

478.61 759.84 28.36

 

Пример выхода

1.2243

2361.0058

 

 

РЕШЕНИЕ

геометрия

 

Анализ алгоритма

Пусть O1, O2, O3 – центры окружностей. Построим треугольник O1O2O3.

 

 

 

 

 

 

 

 

 

 

 

 


Площадь области G найдем как разность площади треугольника O1O2O3 и трех секторов с радиусами r1, r2 , r3. Площадь треугольника O1O2O3 находим по формуле Герона (полупериметр p равен сумме радиусов окружностей r1 + r2 + r3):

S =  =

Площадь сектора находится по углу a и радиусу r по формуле

S = ra

Углы треугольника O1O2O3 находятся по теореме косинусов. Если a – угол, лежащий против стороны длины r2 + r3, то 

(r2 + r3)2 = (r1 + r3)2 + (r1 + r2)2 – 2(r1 + r3) (r1 + r2) cos a

Откуда находится угол a.

 

Реализация алгоритма

Функция geron вычисляет площадь треугольника O1O2O3.

 

double geron(double r1,double r2,double r3)

{

  double result;

  result = (r1 + r2 + r3) * r1 * r2 * r3;

  return sqrt(result);

}

 

Функция angle вычисляет угол треугольника O1O2O3, лежащий против стороны длины r2 + r3. Угол находится из теоремы косинусов.

 

double angle(double r1,double r2,double r3)

{

  double a = ((r1+r3) * (r1+r3) + (r1+r2) * (r1+r2) - (r2+r3) * (r2+r3)) /

             (2 * (r1+r3) * (r1+r2));

  return acos(a);

}

 

Функция squaresector вычисляет площадь сектора с радиусом r и углом a.

 

double squaresector(double r, double a)

{

   return r * r * a / 2;

}

 

Искомая площадь области G находится как разность площади треугольника O1O2O3 и трех секторов с радиусами r1, r2 , r3.

 

double square(void)

{

   double res = geron(r1,r2,r3);

   res -= squaresector(r1,angle(r1,r2,r3));

   res -= squaresector(r2,angle(r2,r1,r3));

   res -= squaresector(r3,angle(r3,r1,r2));

   return res;

}

 

Основной цикл программы. Читаем значения радиусов трех окружностей, вычисляем и печатаем искомую площадь.

 

scanf("%d",&tests);

while(tests--)

{

  scanf("%lf %lf %lf", &r1, &r2, &r3);

  printf("%.6lf\n",square());

}